package client

import (
	"day0304/block"
	"day0304/tools"
	"flag"
	"fmt"
	"os"
)

/*
用户的程序交互接口
只负责读取用户传递过来的命令和参数，并且进行解析
解析后，调用程序的具体功能
*/
type Cli struct {
}

func (cl *Cli) Run() {
	//获取用户输入的信息
	args := os.Args
	//确定当前系统有哪些功能
	/*
		1.创建一个带有创世区块的区块链  参数：创世区块的交易信息
		main.exe  createchain --data "wdfuck"
		2.向区块链中添加新区块 参数：新区块的交易信息
		main.exe addblock --data "sewxx"
		3.查看区块链中所有区块的信息
		main.exe printblock 参数：无
		4.获取区块链中区块的个数 参数：无
		main.exe getblockcount
		5.输出当前系统的使用说明 参数：无
		mian.exe help
	*/


	switch args[1] {
	case "createchain"://创建一个带有创世区块的区块链
		cl.createchain()

	case "addblock"://向区块链中添加新区块
		cl.addblock()

	case "printblock"://查看区块链中所有区块的信息
		cl.printblock()

	case "getblockcount"://获取区块链中区块的个数
		cl.getblockcount()
	case "help"://输出当前系统的使用说明
		cl.help()

	default:
		fmt.Println("没有对应的功能")
		os.Exit(1)

	}

}
func(cl *Cli)createchain(){
	createchain := flag.NewFlagSet("createchain", flag.ExitOnError)
	data := createchain.String("data", "", "创世区块的交易信息")
	createchain.Parse(os.Args[2:])
	//判断区块链是否存在 判断chain.db是否存在
	exist := tools.FileExist("./chain.db")
	if exist {
		fmt.Println("区块链已经存在")
		return
	}
	bc, err := block.CreateChain([]byte(*data))
	defer bc.DB.Close()
	if err != nil {
		fmt.Println(err.Error())
		return
	}
	fmt.Println("区块链创建成功")
}
func (cl *Cli)addblock()  {
	createchain := flag.NewFlagSet("createchain", flag.ExitOnError)
	s := createchain.String("data", "", "添加")
	createchain.Parse(os.Args[2:])
	bc, err := block.CreateChain([]byte(*s))
	bc.AddBlock([]byte(*s))
	defer bc.DB.Close()
	if err !=nil {
		fmt.Println(err.Error())
		return
	}
	fmt.Println("区块链添加成功")
}
func(cl *Cli)printblock(){
	createchain := flag.NewFlagSet("createchain", flag.ExitOnError)
	s := createchain.String("", "", "添加")
	createchain.Parse(os.Args[2:])
	bc, err := block.CreateChain([]byte(*s))
	iterator := bc.Iterator()
	for{
		if iterator.HasNext(){
			block, err := iterator.Next()
			if err !=nil{
				fmt.Println(err.Error())
				break
			}
			fmt.Println(string(block.Data))
		}else{

			break
		}
	}
	defer bc.DB.Close()
	if err !=nil {
		fmt.Println(err.Error())
		return
	}
}
func(cl *Cli)getblockcount(){
	createchain := flag.NewFlagSet("createchain", flag.ExitOnError)
	s := createchain.String("", "", "添加")
	createchain.Parse(os.Args[2:])
	bc, err := block.CreateChain([]byte(*s))
	iterator := bc.Iterator()
	var a = 0
	for{
		if iterator.HasNext(){
			_, err := iterator.Next()
			if err !=nil{
				fmt.Println(err.Error())
				break
			}
			a=a+1
		}else{
			break
		}
	}
	fmt.Println(a)
	defer bc.DB.Close()
	if err !=nil {
		fmt.Println(err.Error())
		return
	}

}
func(cl *Cli)help(){
	createchain := flag.NewFlagSet("createchain", flag.ExitOnError)
	createchain.Parse(os.Args[2:])
	fmt.Println("创建区块")
	fmt.Println("添加区块")
	fmt.Println("查看区块链中所有区块的信息")
	fmt.Println("获取区块链中区块的个数")
	return
}